package com.zx._12_算法.algorithm.math;

import java.util.Stack;

/**
 * @version v1.0
 * @Project: knowledge
 * @Title: CalculateTest
 * @Description: 基本计算器
 *         实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式仅包含非负整数，“+， - ，*，/” 四种运算符和空格。整数除法仅保留整数部分。
 *
 *         示例 1:		输入: "3+2*2"			输出: 7
 *         示例 2:		输入: " 3/2 "			输出: 1
 *         示例 3:		输入: " 3+5 / 2"		输出: 5
 *
 *         题目解析
 *         这道题由于存在运算优先级，首先可以想到使用一个栈来保存数字。
 *         如果数字之前的符号是加或减，那么就把当前数字压入栈中；
 *         如果之前的符号是乘或除，那么就从栈顶取出一个数字和当前数字进行乘或除的运算，再把结果压入栈中。
 *         这里需要注意，减法是通过加入当前数字的相反数来实现。这样完成一遍遍历后，所有的乘或除都运算完了，再把栈中所有的数字都加起来就是最终结果了。
 * @author: Administrator
 * @date: 2019年11月18日下午5:24:39
 * @company: 未知之地
 * @Copyright: Copyright (c) 2015
 */
public class CalculateTest {

    public static void main(String[] args) {
//		String exp = "3+2*2";
//		String exp = "3/2";
        String exp = "3+5/2";
        char[] cs = exp.toCharArray();
        Stack<String> nums = new Stack<String>();
        for (int i = 0; i < cs.length; i++) {
            char c = cs[i];
            if (i == 0 || c == '+' || c == '-' || c == '*' || c == '/') {
                nums.push(String.valueOf(c));
            } else {//数字
                //拿出上一个对比下看看是否是一个大的数字
                String peek = nums.peek();
                if (peek == null || "+".equals(peek) || "-".equals(peek) || "*".equals(peek) || "/".equals(peek)) {
                    nums.push(String.valueOf(c));
                } else {
                    nums.pop();
                    nums.push(peek + c);
                }
            }
        }

        String[] data = nums.toArray(new String[nums.size()]);
        Stack<String> stack = new Stack<String>();
        for (int i = 0; i < data.length; i++) {
            String d = data[i];
            if ("+".equals(d)) {
                data[i + 1] = data[i + 1];
            } else if ("-+".equals(d)) {
                data[i + 1] = "-" + data[i + 1];
            } else if ("*".equals(d)) {
                String d2 = data[i + 1];//向后去一个数字
                String pop = stack.pop();
                int num1 = Integer.parseInt(pop);
                int num2 = Integer.parseInt(d2);
                int num = num1 * num2;

                stack.push(num + "");
                i++;
            } else if ("/".equals(d)) {
                String d2 = data[i + 1];//向后去一个数字
                String pop = stack.pop();
                int num1 = Integer.parseInt(pop);
                int num2 = Integer.parseInt(d2);
                int num = num1 / num2;
                stack.push(num + "");
                i++;
            } else {//数字
                stack.push(d);
            }
        }

        int result = 0;
        while (!stack.empty()) {
            result += Integer.parseInt(stack.pop());
        }

        System.out.println(result);
    }
}
